package com.ecommerce.onion.domain;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.math.BigDecimal;
import java.util.Objects;
import java.util.UUID;
/**
 * @packageName: domain（领域包）
 * @className: Product(产品领域)
 * @description: 展现给客户的产品
 * @author: luds
 * @version: v1.0
 * @date: 2021-03/25
 */
public class Product {
    /**
     * 产品ID
     */
    private final UUID id;
    /**
     * 产品价格
     */
    private final BigDecimal price;
    /**
     * 产品名
     */
    private final String name;

    /**
     * 由产品ID、产品价格、产品名构建产品
     * @param id 产品ID
     * @param price 产品价格
     * @param name 产品名
     */
    @JsonCreator
    public Product(@JsonProperty("id") final UUID id, @JsonProperty("price") final BigDecimal price, @JsonProperty("name") final String name) {
        if(id != null){
            this.id = id;
        }else{
            this.id = UUID.randomUUID();
        }
        this.price = price;
        this.name = name;
    }

    /**
     * 获取产品价格
     * @return 返回产品价格
     */
    public BigDecimal getPrice() {
        return price;
    }

    /**
     * 获取产品名
     * @return 返回产品名
     */
    public String getName() {
        return name;
    }

    /**
     * 获取产品ID
     * @return 返回产品ID
     */
    public UUID getId() {
        return id;
    }
    /**
     * 如果是此产品本身就返回true，如果不是产品就返回false；
     * 除了上述两种情况：如果产品ID、价格、产品名都相同，就返回true，否则false
     * @param o: 比较对象
     * @return 比较结果
     */
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Product product = (Product) o;
        return Objects.equals(id, product.id) && Objects.equals(price, product.price) && Objects.equals(name, product.name);
    }
    /**
     * 由ID、产品价格、产品名组合成哈希值
     * @return 返回哈希值
     */
    @Override
    public int hashCode() {
        return Objects.hash(id, price, name);
    }
}
